package com.example.mapper;

import com.example.entity.Comment;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * 操作comment相关数据接口
 */
public interface CommentMapper {

    /**
     * 新增
     */
    int insert(Comment comment);

    /**
     * 删除
     */
    int deleteById(Integer id);

    /**
     * 修改
     */
    int updateById(Comment comment);

    /**
     * 根据ID查询
     */
    Comment selectById(Integer id);

    /**
     * 查询所有
     */
    List<Comment> selectAll(Comment comment);

    /**
     * 查询指定业务对象下的所有评论及用户信息（用于构建树形结构的基础数据）
     *
     * @param fid    关联的业务对象ID
     * @param module 业务模块标识
     * @return 包含用户信息的评论列表（每条评论包含user.avatar和user.name字段）
     * 数据字段说明：
     * - comment.*: 评论表所有字段（id, content, time, pid, rootId, fid, module, user_id等）
     * - user.avatar: 用户头像URL
     * - user.name as userName: 用户姓名（别名避免与Comment对象的name属性冲突）
     * 执行逻辑：
     * 1. 左连接用户表，确保即使评论没有关联用户（理论上必有关联）也能查询到
     * 2. 通过fid和module筛选属于指定业务对象的评论
     * 3. 按评论ID降序排序，保证最新评论在前
     */
    List<Comment> selectTree(
            @Param("fid") Integer fid,       // MyBatis参数注解：业务对象ID
            @Param("module") String module    // MyBatis参数注解：业务模块标识
    );

    @Select("select count(*) from comment where fid = #{fid} and module = #{module}")
    Integer selectCount(
            @Param("fid") Integer fid,       // MyBatis参数注解：业务对象ID
            @Param("module") String module    // MyBatis参数注解：业务模块标识
    );

    @Select("select * from comment where pid = #{pid}")
    List<Comment> selectByPid(Integer pid);
}